package cn.iune.backcenter.author;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.justep.baas.Utils;


@Transactional
@Service
public class AuthorizeServiceImpl implements IAuthorizeService {
	
	
	@Autowired  
    private ISaOporgService saOporgService;
	@Autowired  
    private ISaOpauthorizeService saOpauthorizeService;
	@Autowired  
    private ISaOppermissionService saOppermissionService;
	@Autowired
	private ISaOproleService saOproleService;
	

	
	
//	@Override
//	public JSONObject getSysAppListByOrgID(String orgID) {
//		JSONObject json = new JSONObject();
//		json.put("code", 0);
//		json.put("data", sysInfoOrgService.getByOrgID(orgID)); 
//		return json;
//	}	
	
	/*
	@Override
	public List<String> getNavigationSysInfoFIDs(SaOporg org) {
		// TODO Auto-generated method stub

//		System.out.println("saOporg当前组织-->"+psm.getsFName());
        
        //根据人员获取全部相关的组织关系
//		List<SaOporg> saOporgList = saOporgUtil.getPersonOrgs(person);
		//根据人员成员获取上级组织关系（，包含当前人员成员，到当前公司为止）
		List<SaOporg> saOporgList = saOporgService.getSuperiors(org);
        //打印当前人员的全部组织关系
//        for(SaOporg obj : saOporgList){
//        	System.out.println(obj.getsFName()+"----"+obj.getsLevel());
//        }
        
        //取得授权的同时，取得systemFullID，用于左侧树形菜单显示
        List<String> systemFullIDs = new ArrayList<>();
        
        //2根据人员查找到我们定义的角色（相当于realm的角色组）
//        List<String> saOproleIDList = new ArrayList<String>();
        //3根据我们定义的角色ID列表获取功能权限列表，就是realm定义的角色和权限
        
        //从授权列表中获取对应的roleID
        Set<String> roleIDs = saOpauthorizeService.getRoleIDs(saOporgList);//new HashSet<String>();
        
        for(String saOproleID : roleIDs){
        	//循环我们自定义的角色id
        	List<SaOppermission> saOppermissionList = saOppermissionService.getByPermissionRoleID(saOproleID);
            for(SaOppermission saOppermission : saOppermissionList){
            	//功能权限及菜单显示
            	if(saOppermission.getsPermissionKind()==0){
            		//0代表功能权限
	            	//取得systemFullID
	            	//导航菜单                       判断菜单是否显示
	            	String sDisplay = saOppermission.getsDisplay();
	            	if(!"N".equals(sDisplay)){
	            		String id = saOppermission.getSystemFullID();
	            		if(systemFullIDs.contains(id)==false){
			            	systemFullIDs.add(id);
	            		}else{
	            			System.out.println("功能权限存在，无需重复添加！");
	            		}
	            	}
            	}
            }
        }
        
        
        //菜单使用的systemFullID
//        System.out.println("菜单使用的systemFullIDs列表如下：");
        List<String> ids = new ArrayList<String>();
        for (String systemFullID : systemFullIDs) {  
//            System.out.println("systemFullID------------------->"+systemFullID);
        	String[] idsArray = systemFullID.split("/"); 
        	for(int i=0;i<idsArray.length;i++){
        		String id = idsArray[i];
//                System.out.println("id------------------->"+id);
                if(!id.equals("")){
            		//处理扩展名的问题
            		String[] ss = id.split("\\.");
//            		for(int j=0;j<ss.length;j++){
//            			System.out.println("ss[j]------------------->"+ss[j]);
//            		}
            		ids.add(ss[0]);
                }
        	}
        } 
        
        System.out.println("整理成ognID数组列表如下：");
        for (String id : ids) {
            System.out.println("------------------->"+id);
        }
        
        //写入session（导航菜单）
//        Session session = SecurityService.getCurrentSession();
//        session.setAttribute("treeNavigation", ids);
//    	for(int i=0;i<2;i++){
//    		fids.add("");
//    	}
        return ids;
	}
	*/


	/*
	 * @Transactional
	 * 
	 * @Override public int copyList(String ognID,String sCreatorFID) { //获取机构信息
	 * SaOporg saOporg = saOporgService.getByID(ognID); if(saOporg!=null){
	 * List<SysInfo> sysInfoList = sysInfoService.getRoots(""); for(SysInfo
	 * sysInfo:sysInfoList){ //启用状态 if("open".equals(sysInfo.getStatus())){
	 * SysInfoOrg sysInfoOrg = null; //判断是否已经存在 sysInfoOrg =
	 * sysInfoOrgService.getByNo(sysInfo.getfID(), ognID); if(sysInfoOrg==null){
	 * //对象不存在，拷贝 sysInfoOrg = new SysInfoOrg(); sysInfoOrg.setfID(Utils.getUUID());
	 * 
	 * sysInfoOrg.setOrgID(ognID); sysInfoOrg.setSystemID(sysInfo.getfID());
	 * sysInfoOrg.setStatus("N"); sysInfoOrg.setPeriodStatus("N");
	 * sysInfoOrg.setActualStart(Utils.getCurrentDate());
	 * 
	 * sysInfoOrg.setsCreatorFID(sCreatorFID); sysInfoOrg.setVersion(0);
	 * 
	 * sysInfoOrgService.insert(sysInfoOrg); } } }
	 * 
	 * }else{ return -1; } return 0; }
	 */
		
	@Override
	public List<SaOppermission> getPermissions(String orgID) {
		SaOporg org = saOporgService.getByID(orgID);
		return this.getPermissions(org);
	}
	
	
	@Override
	public List<SaOppermission> getPermissions(SaOporg org) {
		// TODO Auto-generated method stub
		List<SaOppermission> list = new ArrayList<SaOppermission>();
//		System.out.println("saOporg当前组织-->"+psm.getsFName());
        
        //根据人员获取全部相关的组织关系
//		List<SaOporg> saOporgList = saOporgUtil.getPersonOrgs(person);
		//根据人员成员获取上级组织关系（，包含当前人员成员，到当前公司为止）
		List<SaOporg> saOporgList = saOporgService.getSuperiors(org);
        //打印当前人员的全部组织关系
//        for(SaOporg obj : saOporgList){
//        	System.out.println(obj.getsFName()+"----"+obj.getsLevel());
//        }
        
        //2根据人员查找到我们定义的角色（相当于realm的角色组）
//        List<String> saOproleIDList = new ArrayList<String>();
        //3根据我们定义的角色ID列表获取功能权限列表，就是realm定义的角色和权限
        
        //从授权列表中获取对应的roleID
        Set<String> roleIDs = saOpauthorizeService.getRoleIDs(saOporgList);//new HashSet<String>();
        
        for(String saOproleID : roleIDs){
        	//循环我们自定义的角色id
        	List<SaOppermission> saOppermissionList = saOppermissionService.getByPermissionRoleID(saOproleID);
            for(SaOppermission saOppermission : saOppermissionList){
            	//功能权限及菜单显示
            	if(saOppermission.getsPermissionKind()==0){
            		//0代表功能权限
            		if(list.contains(saOppermission)==false){
                		list.add(saOppermission);
            		}
            	}
            }
        }
        
        
        return list;
	}

	/*
	@Transactional
	@Override
	public JSONObject newPersonMember(JSONObject data) {
		System.out.println("data-->"+data.toJSONString());
		JSONObject personData = data.getJSONObject("data");
		System.out.println("personData-->"+personData.toJSONString());
		//检查人员档案的唯一性
		SaOpperson person = JSON.toJavaObject(personData, SaOpperson.class);
		JSONObject json = new JSONObject();
		json.put("code", 0);
		json.put("status", "success");
		
		String sLoginName = person.getsLoginName();
		String sMail = person.getsMail();
		String sMobilePhone = person.getsMobilePhone();
		if(Utils.isNotEmptyString(sLoginName)) {
			if(saOppersonService.getByLoginName(sLoginName)!=null) {
				//已经存在
				json.put("code", -1);
				json.put("status", "用户名已经存在");
				return json;
			}
		}
		if(Utils.isNotEmptyString(sMail)) {
			if(saOppersonService.getByMail(sMail)!=null) {
				//已经存在
				json.put("code", -2);
				json.put("status", "电子邮件地址已经存在");
				return json;
			}
		}
		if(Utils.isNotEmptyString(sMobilePhone)) {
			if(saOppersonService.getByMobilePhone(sMobilePhone)!=null) {
				//已经存在
				json.put("code", -3);
				json.put("status", "手机号已经存在");
				return json;
			}
		}
		
		saOppersonService.insert(person);
		String orgID = data.getString("orgID");
		String personID = person.getsID();
//		System.out.println("orgID-->"+orgID+"--personID-->"+personID);
		String sCreatorFID = data.getString("sCreatorFID");
		saOporgService.addPersonMember(orgID, personID, sCreatorFID);
		
		return json;
	}
	*/
	
	
	//添加gongneng权限
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOppermissionService#add(com.alibaba.fastjson.JSONObject)
	 */
	@Transactional
	@Override
	public void addFuncPerm(JSONObject data)  {
		// 获取参数
		JSONArray roleIDs = data.getJSONArray("roleIDs"); // 角色ids数组
		JSONArray sysInfos = data.getJSONArray("sysInfos"); // 权限数组
		//System.out.println("sysInfos-->"+sysInfos);
		for(int x=0;x<sysInfos.size();x++){
			//SysInfo sysInfo = sysInfoService.getByID(sysInfoIDs.getString(x));
			JSONObject sysInfo = sysInfos.getJSONObject(x);
			String absoluteUrl = sysInfo.getString("absoluteUrl");
			String systemFullID = sysInfo.getString("systemFullID");
			String systemFullName = sysInfo.getString("systemFullName");
			//if(sysInfo.getAbsoluteUrl()!=null && !"".equals(sysInfo.getAbsoluteUrl())){
			if(absoluteUrl!=null && !"".equals(absoluteUrl)){
				//路径不能为空
				for(int y=0;y<roleIDs.size();y++){
//					System.out.println("sysInfoIDs-->"+sysInfoIDs.getString(x)+"-------"+"roleIDs-->"+roleIDs.getString(y));
					//首先判断是否存在授权
					SaOppermission saOppermission = saOppermissionService.getBySystemFullIDRoleID(systemFullID, roleIDs.getString(y));
					if(saOppermission==null){
						//不存在，新建
						saOppermission = new SaOppermission();
						saOppermission.setsID(Utils.getUUID());
						saOppermission.setSystemFullID(systemFullID);
						saOppermission.setsProcess(absoluteUrl);
						saOppermission.setsActivity(null);
						saOppermission.setsActivityFName(systemFullName);
						saOppermission.setsDescription(null);
						saOppermission.setsPermissionKind(0);
						saOppermission.setsActions(null);
						saOppermission.setsActionsNames(null);
						saOppermission.setsSemanticDP(null);
						saOppermission.setsSequence(0);
						saOppermission.setsValidState(1);
//						saOppermission.setVersion(0);
						saOppermission.setsDataAccess("public");
						
//						saOpauthorize.setsCreatorFID(SecurityService.getCurrentPerson().getsID());
//						saOpauthorize.setsCreatorFName(SecurityService.getCurrentPerson().getsName());
//						saOpauthorize.setsCreateTime(CommonService.getCurrentDateTime());
						
						saOppermission.setsPermissionRoleID(roleIDs.getString(y));
						
						saOppermissionService.insert(saOppermission);
					}else{
						continue;
					}
				}
				
			}
		}
	}	
	
	//添加数据权限
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOppermissionService#add(com.alibaba.fastjson.JSONObject)
	 */
	@Transactional
	@Override
	public void addDataPerm(JSONObject data) {
		// 获取参数
		JSONArray roleIDs = data.getJSONArray("roleIDs"); // 角色ids数组
		JSONArray orgIDs = data.getJSONArray("orgIDs"); // 权限ids数组
//		System.out.println("orgIDs-->"+orgIDs);
		for(int x=0;x<orgIDs.size();x++){
			SaOporg saOporg = saOporgService.getByID(orgIDs.getString(x));
			if(saOporg!=null){
				//路径不能为空
				for(int y=0;y<roleIDs.size();y++){
//					System.out.println("orgIDs-->"+orgIDs.getString(x)+"-------"+"roleIDs-->"+roleIDs.getString(y));
					//首先判断是否存在授权
					SaOppermission saOppermission = saOppermissionService.getBySystemFullIDRoleID(saOporg.getsFID(), roleIDs.getString(y));
					if(saOppermission==null){
						//不存在，新建
						saOppermission = new SaOppermission();
						saOppermission.setsID(Utils.getUUID());
						saOppermission.setSystemFullID(saOporg.getsFID());
						saOppermission.setsProcess(null);
						saOppermission.setsActivity(null);
						saOppermission.setsActivityFName(saOporg.getsFName());
						saOppermission.setsDescription(null);
						saOppermission.setsPermissionKind(1);//0：功能权限，1：数据权限
						saOppermission.setsActions(null);
						saOppermission.setsActionsNames(null);
						saOppermission.setsSemanticDP(null);
						saOppermission.setsSequence(0);//排序号
						saOppermission.setsValidState(1);
//						saOppermission.setVersion(0);
						
//						saOpauthorize.setsCreatorFID(SecurityService.getCurrentPerson().getsID());
//						saOpauthorize.setsCreatorFName(SecurityService.getCurrentPerson().getsName());
//						saOpauthorize.setsCreateTime(CommonService.getCurrentDateTime());
						
						saOppermission.setsPermissionRoleID(roleIDs.getString(y));
						
						saOppermissionService.insert(saOppermission);
					}else{
						continue;
					}
				}
				
			}
		}
	}	

	
	//添加授权
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOpauthorizeService#add(com.alibaba.fastjson.JSONObject)
	 */
	@Transactional
	@Override
	public void addAuthorize(JSONObject data)  {
		// 获取参数
		String personID = data.getString("personID");
		String personName = data.getString("personName");
		
		JSONArray orgIDs = data.getJSONArray("orgIDs"); // 组织ids数组
		JSONArray roleIDs = data.getJSONArray("roleIDs"); // 角色ids数组
		for(int x=0;x<orgIDs.size();x++){
			SaOporg saOporg = saOporgService.getByID(orgIDs.getString(x));
			
			for(int y=0;y<roleIDs.size();y++){
				SaOprole saOprole = saOproleService.getByID(roleIDs.getString(y));
				//首先判断是否存在授权
				SaOpauthorize saOpauthorize = saOpauthorizeService.getByOrgRoleID(orgIDs.getString(x), roleIDs.getString(y));
				if(saOpauthorize==null){
					//不存在，新建
					saOpauthorize = new SaOpauthorize();
					saOpauthorize.setsID(Utils.getUUID());
					saOpauthorize.setsAuthorizeRoleID(roleIDs.getString(y));
					saOpauthorize.setsDescription(saOprole.getsName()+"["+saOprole.getsCode()+"]");
					
					saOpauthorize.setsOrgID(orgIDs.getString(x));
					saOpauthorize.setsOrgName(saOporg.getsName());
					saOpauthorize.setsOrgFID(saOporg.getsFID());
					saOpauthorize.setsOrgFName(saOporg.getsFName());
					
					saOpauthorize.setsCreatorFID(personID);
					saOpauthorize.setsCreatorFName(personName);
					saOpauthorize.setsCreateTime(Utils.getCurrentDateTime());
					
					saOpauthorizeService.insert(saOpauthorize);
				}else{
					continue;
				}
			}
		}
	}	

	//shiro为角色授权。此函数已经写好，未经测试（因为权限数据是明文传到node节点的）。暂不适用
	@Transactional
	@Override
	public JSONObject doGetAuthorizationInfo(String appId, String psmId)  {
		JSONObject json = new JSONObject();
        
        Set<String> realmRoles = new HashSet<String>();
        //Collection<String> realmPermissions = new ArrayList<String>();
        Set<String> realmPermissions = new HashSet<String>();
        
        //与人员成员相关的权限
        //1、获取人员成员
		SaOporg psm = saOporgService.getByID(psmId);//SecurityService.getCurrentPsm();
		if(psm==null){
//			System.out.println("saOporg-->当前组织为空！无需加载组织相关的授权！");
			json.put("code", -1);
			json.put("msg", "failure");
			json.put("info", "人员成员不存在，没有授权可用！");
			return json;
		}else{
//			System.out.println("saOporg当前组织-->"+psm.getsFName());
	        
	        //取得授权的同时，取得systemFullID，用于左侧树形菜单显示
	        //List<String> systemFullIDs = new ArrayList<>();
	        
	        //获取数据访问权限
	        //List<String> dataAccessIDs = new ArrayList<String>();
	        //获取数据访问权限是否启用，如果没有启用，则数据访问权限不起作用
	        Map<String,String> dataAccessUrls = new HashMap<String,String>();
			
	        //从授权列表中获取对应的roleID
	        Set<String> roleIDs = saOpauthorizeService.getRoleIDs(psm.getsFID());
	        System.out.println("roleIDs.size()-->>"+roleIDs.size());
	        
	        for(String saOproleID : roleIDs){
	        	//循环我们自定义的角色id
	        	List<SaOppermission> saOppermissionList = saOppermissionService.getByPermissionRoleID(saOproleID);
		        System.out.println("saOppermissionList.size()-->>"+saOppermissionList.size());
	            for(SaOppermission saOppermission : saOppermissionList){
            		//String systemFullID = saOppermission.getSystemFullID();
		            
	            	//功能权限及菜单显示
            		//1、功能权限
	            	if(saOppermission.getsPermissionKind()==0){
	            		//0代表功能权限
		            	//取得systemFullID
	            		String url = saOppermission.getsProcess();
//	            		System.out.println(url);
	            		//角色realmRoles
	            		if(realmRoles.contains(url)==false){
			            	realmRoles.add(url);
	            		}
		            	
		            	//授权realmPermissions
		            	String actions  = saOppermission.getsActions();
		            	if(null!=actions && !"".equals(actions)){
		            		//处理权限
		            		String[] actionsArray = actions.split(",");
		            		for(int i=0;i<actionsArray.length;i++){
		            			String action = actionsArray[i];
		            			String permission = url + ":" + action;
		                		realmPermissions.add(permission);
		            		}
		            	}
	            		
	            		
	            		//加载数据权限只显示自己的数据
	            		if(dataAccessUrls.containsKey(url)==false){
	            			String dense = saOppermission.getsDataAccess();
	            			if(dense==null){
	            				dense = "Y";
	            			}
			            	//System.out.println("加载数据权限只显示自己的数据，在功能权限界面进行设置："+dense);
		            		dataAccessUrls.put(url, dense);  
	            		}else{
	            			System.out.println("加载数据权限只显示自己的数据,url存在，无需重复添加！");
	            		}
	            		
	            	}
	            	
	            	//2、数据权限
	            	//目前没有使用，感觉不太合适
	            	//System.out.println("加载数据权限");
	            	//数据权限//1代表数据权限
//	            	if(saOppermission.getsPermissionKind()==1){
//	            		if(dataAccessIDs.contains(systemFullID)==false){
//			            	dataAccessIDs.add(systemFullID);
//	            		}else{
//	            			System.out.println("数据权限存在，无需重复添加！");
//	            		}
//	            	}
	            }
	        }
	        
	        
	        //菜单使用的systemFullID
	        /*
//	        System.out.println("菜单使用的systemFullIDs列表如下：");
	        List<String> ids = new ArrayList<String>();
	        for (String systemFullID : systemFullIDs) { 
//	            System.out.println("systemFullID------------------->"+systemFullID);
	        	String[] idsArray = systemFullID.split("/"); 
	        	for(int i=0;i<idsArray.length;i++){
	        		String id = idsArray[i];
//	                System.out.println("id------------------->"+id);
	                if(!id.equals("")){
	            		//处理扩展名的问题
	            		String[] ss = id.split("\\.");
//	            		for(int j=0;j<ss.length;j++){
//	            			System.out.println("ss[j]------------------->"+ss[j]);
//	            		}
//	    	            System.out.println("fID------------------->"+ss[0]);
	            		//添加之前，判断是否已经存在
	            		boolean isExist = false;
	            		for(int x=0;x<ids.size();x++) {
	            			if(ids.get(x).equals(ss[0])) {
	            				isExist = true;
	            				break;
	            			}
	            		}
	            		if(isExist==false) {
		            		//不存在，添加
		            		ids.add(ss[0]);
	            		}
	                }
	        	}
	        }
	        */
		
			JSONObject data = new JSONObject();
			data.put("realmRoles", realmRoles);
			data.put("realmPermissions", realmPermissions);
			data.put("dataAccessUrls", dataAccessUrls);

			json.put("code", 0);
			json.put("msg", "success");
			json.put("data", data);
	        return json;
		}
	}



}
